MongoDB与PostgresQL无责任初步测试
PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不代表真实的生产环境下的情况,只能说给大家一个比较直观的概念,可用于设计架构时候的估算。(量级上来说应该基本上是正确的)
本次测试选择的服务器环境为:
- VMWare虚拟机(双核,4G内存)
- CentOS 7
- MongoDB 3.2
- PostgresQL 9.4
- 客户端均为Java版
- 单线程客户端
插入数据比较简单,PostgresQL中创建这么一张表:
CREATE TABLE realtime( id BIGINT PRIMARY KEY, longtitude DOUBLE PRECISION, latitude DOUBLE PRECISION, velocity DOUBLE PRECISION, soc DOUBLE PRECISION );
对应地,MongoDB中的Document大致如此:
{ "_id" : NumberLong(1458587322), "longitude" : 0.5812149460333115, "latitude" : 0.23716701482457414, "velocity" : 0.9920389498763238, "soc" : 0.6602090307636349 }
数据随机生成,只有id为索引。
插入100万条数据
- MongoDB(带ACK)——约300秒(约3300条/秒)
- MongoDB(无ACK)——约35秒(月28000条/秒)
- PostgresQL——约670秒(约1500条/秒)
不带ACK的MongoDB的速度大约是PostgresQL的20倍,写入条目数可轻松破万。
随机查询(无索引,600万条数据)
- MongoDB——约2秒
- PostgresQL——约0.5秒
这次PostgresQL占优,速度大约是MongoDB的4倍。
顺序读取一万条数据
- MongoDB——约0.1秒
- PostgresQL——约0.5秒
这次MongoDB占优,速度大约是PostgresQL的5倍。
也许你说MongoDB和PostgresQL是两种不同截然的数据库系统啊,干嘛放一起比?我当然知道,所以才拿出来比,(呵呵)比较后才知道什么情况下用什么样的数据库,怎么样才能将其能力发挥到最好嘛,对不对?于是有了下面这些“无责任”的结论(或者说小小建议了):
- PostgresQL功能强大通用性好可靠性高适用面广(嗯?我的测试并未反映出这点啊?请执行忽略掉这些细节)
- MongoDB适合于逻辑简单,存储量大,性能要求高,而可靠性要求相对不高的场合
- 存储量巨大的情况下,MongoDB的查询必须得依赖索引
- MongoDB的索引越少性能越好,磁盘空间消耗越少(索引能不要就不要),和前一点做一些自我平衡吧
实际的情况会有哪些不同?实际中性能肯定是要比这个高的,我这次只是用了一台本地的虚拟机用单线程访问尝试了一下,真实环境下的话肯定是高配置的服务器主机加多线程。一般来说关系型数据库(PostgresQL这种)在单台主机上的表现确实存在一个性能瓶颈,每秒写入万条对关系型数据库来说就很吃力,如果遇到了这个瓶颈,就可以考虑调整系统架构,使用NoSQL(MongoDB这种)分摊一些数据存储了,当然了,逻辑复杂,事务性要求高的数据还是得用PostgresQL,MongoDB则用于存那些“又大又傻”的数据。